home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 23 / AACD 23.iso / AACD / Online / opennap / list_users.c < prev    next >
C/C++ Source or Header  |  2001-06-08  |  5KB  |  189 lines

  1. /* Copyright (C) 2000-1 drscholl@users.sourceforge.net
  2.    This is free software distributed under the terms of the
  3.    GNU Public License.  See the file COPYING for details.
  4.  
  5.    $Id: list_users.c,v 1.25 2001/02/15 08:39:45 drscholl Exp $ */
  6.  
  7. #include <string.h>
  8. #include <ctype.h>
  9. #include "opennap.h"
  10. #include "debug.h"
  11.  
  12. /* packet contains: <channel> */
  13. HANDLER (list_users)
  14. {
  15.     CHANNEL *chan;
  16.     LIST   *list;
  17.     CHANUSER *chanUser;
  18.  
  19.     (void) tag;
  20.     (void) len;
  21.     ASSERT (validate_connection (con));
  22.     CHECK_USER_CLASS ("list_users");
  23.     chan = hash_lookup (Channels, pkt);
  24.     if (!chan)
  25.     {
  26.     nosuchchannel (con);
  27.     return;
  28.     }
  29.     ASSERT (validate_channel (chan));
  30.     /* make sure this user is on the channel */
  31.     if (list_find (con->user->channels, chan) == 0)
  32.     {
  33.     send_cmd (con, MSG_SERVER_NOSUCH, "you're not on channel %s",
  34.           chan->name);
  35.     return;
  36.     }
  37.  
  38.     for (list = chan->users; list; list = list->next)
  39.     {
  40.     chanUser = list->data;
  41.     ASSERT (chanUser->magic == MAGIC_CHANUSER);
  42.     send_cmd (con, MSG_SERVER_NAMES_LIST /* 825 */ , "%s %s %d %d",
  43.           chan->name, chanUser->user->nick, chanUser->user->shared,
  44.           chanUser->user->speed);
  45.     }
  46.  
  47.     send_cmd (con, MSG_SERVER_NAMES_LIST_END /* 830 */ , "");
  48. }
  49.  
  50. #define ON_GFLAG_ELITE        1
  51. #define ON_GFLAG_ADMIN        2
  52. #define ON_GFLAG_MODERATOR    4
  53. #define ON_GFLAG_LEECH        8
  54. #define ON_GFLAG_MUZZLED    16
  55. #define ON_GFLAG_CLOAKED    32
  56. #define ON_GFLAG_USERS        64
  57. #define ON_GFLAG_CHANNEL    128
  58. #define ON_GFLAG_USERIP        256
  59.  
  60. struct guldata
  61. {
  62.     int     flags;
  63.     char   *server;
  64.     char   *chan;
  65.     unsigned int ip;
  66.     unsigned int mask;
  67.     CONNECTION *con;
  68. };
  69.  
  70. static void
  71. global_user_list_cb (USER * user, struct guldata *data)
  72. {
  73.     ASSERT (validate_user (user));
  74.     ASSERT (data != 0);
  75.     if (data->flags)
  76.     {
  77.     /* selectively display users based on user level/muzzle/cloak */
  78.     if (!
  79.         (((data->flags & ON_GFLAG_ADMIN) && user->level == LEVEL_ADMIN)
  80.          || ((data->flags & ON_GFLAG_ELITE) && user->level == LEVEL_ELITE)
  81.          || ((data->flags & ON_GFLAG_MODERATOR)
  82.          && user->level == LEVEL_MODERATOR)
  83.          || ((data->flags & ON_GFLAG_USERS) && user->level == LEVEL_USER)
  84.          || ((data->flags & ON_GFLAG_LEECH) && user->level == LEVEL_LEECH)
  85.          || ((data->flags & ON_GFLAG_MUZZLED) && user->muzzled)
  86.          || ((data->flags & ON_GFLAG_CLOAKED) && user->cloaked)
  87.          || ((data->flags & ON_GFLAG_USERIP) && (user->ip & data->mask) == (data->ip & data->mask))))
  88.         return;
  89.     }
  90.     if (data->server && *data->server != '*' &&
  91.     strcasecmp (data->server, user->server) != 0)
  92.     return;            /* no match */
  93.     send_cmd (data->con, MSG_SERVER_GLOBAL_USER_LIST, "%s %s", user->nick,
  94.           my_ntoa (BSWAP32 (user->ip)));
  95. }
  96.  
  97.  
  98. /* 831 [server] [flags] */
  99. HANDLER (global_user_list)
  100. {
  101.     struct guldata data;
  102.     char *flag, *ip;
  103.     
  104.     ASSERT (validate_connection (con));
  105.     (void) len;
  106.     CHECK_USER_CLASS ("global_user_list");
  107.     if (con->user->level < LEVEL_MODERATOR)
  108.     {
  109.     permission_denied (con);
  110.     return;
  111.     }
  112.     memset(&data,0,sizeof(data));
  113.     data.con = con;
  114.     data.server = next_arg (&pkt);
  115.  
  116.     flag = next_arg (&pkt);
  117.     while (flag && *flag)
  118.     {
  119.     switch (*flag)
  120.     {
  121.         case 'e':
  122.         data.flags |= ON_GFLAG_ELITE;
  123.         break;
  124.         case 'a':
  125.         data.flags |= ON_GFLAG_ADMIN;
  126.         break;
  127.         case 'm':
  128.         data.flags |= ON_GFLAG_MODERATOR;
  129.         break;
  130.         case 'u':
  131.         data.flags |= ON_GFLAG_USERS;
  132.         break;
  133.         case 'l':
  134.         data.flags |= ON_GFLAG_LEECH;
  135.         break;
  136.         case 'z':
  137.         data.flags |= ON_GFLAG_MUZZLED;
  138.         break;
  139.         case 'i':
  140.         data.flags |= ON_GFLAG_USERIP;
  141.         ip = next_arg (&pkt);
  142.         if (!ip || !is_address (ip, &data.ip, &data.mask))
  143.             goto guser_end;
  144.         break;
  145.         case 'c':
  146.         data.flags |= ON_GFLAG_CLOAKED;
  147.         break;
  148.         case 'C':
  149.         data.flags |= ON_GFLAG_CHANNEL;
  150.         data.chan = next_arg (&pkt);
  151.         break;
  152.     }
  153.     flag++;
  154.     if (!*flag)
  155.         flag = next_arg (&pkt);
  156.     }
  157.  
  158.     if (data.flags & ON_GFLAG_CHANNEL)
  159.     {
  160.     CHANNEL *chan;
  161.     LIST   *list;
  162.     CHANUSER *chanUser;
  163.  
  164.     /* this needs to be unset otherwise global_user_list_cb() will
  165.      * bomb out.
  166.      */
  167.     data.flags &= ~ON_GFLAG_CHANNEL;
  168.     if (data.chan)
  169.     {
  170.         chan = hash_lookup (Channels, data.chan);
  171.         if (chan)
  172.         {
  173.         for (list = chan->users; list; list = list->next)
  174.         {
  175.             chanUser = list->data;
  176.             ASSERT (chanUser->magic == MAGIC_CHANUSER);
  177.             global_user_list_cb (chanUser->user, &data);
  178.         }
  179.         }
  180.         else
  181.         nosuchchannel (con);
  182.     }
  183.     }
  184.     else
  185.     hash_foreach (Users, (hash_callback_t) global_user_list_cb, &data);
  186. guser_end:
  187.     send_cmd (con, tag, "");    /* end of list */
  188. }
  189.